package persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import model.*;

public class PersistenciaHotel {

	private static PersistenciaHotel instancia;
	
	public static PersistenciaHotel getInstancia()
	{
		if (instancia== null)
			instancia =new PersistenciaHotel();
		return instancia;
	}
	
	public Hotel insertHotel(Hotel h) //HECHO
	{ 
		int newId=0;
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		try
		{			
			String senten = "INSERT INTO Hotel "
					+ "(codigo, nombre, id_destino, domicilio, cod_postal, "
					+ "activo, categoria, calificacion, cadena, tel, email, web, descripcion) "
					+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
			
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten, Statement.RETURN_GENERATED_KEYS);
			
			ps.setString(1, h.getCodigo());
			ps.setString(2, h.getNombre());
			ps.setInt(3, h.getDestino().getId());
			ps.setString(4, h.getDomicilio());
			ps.setString(5, h.getCodigoPostal());
			ps.setBoolean(6, h.estaActivo());
			ps.setInt(7, h.getCategoria());
			ps.setInt(8, h.getCategoriaInterna());
			ps.setString(9, h.getCadena());
			ps.setString(10, h.getTelefono());
			ps.setString(11, h.getEmail());
			ps.setString(12, h.getWeb());
			ps.setString(13, h.getDescripcion());
						
			ps.execute();
			ResultSet  generatedKeys = ps.getGeneratedKeys();
			if(generatedKeys.next())
			{	
				newId = generatedKeys.getInt(1);
			}
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			h.setId(newId);
						
			//inserta habitaciones
			for(Habitacion hab : h.getHabitaciones()){
				PersistenciaHabitacion.getInstancia().insertHabitacion(hab, h.getId());
			}
			
			//inserta comodidades hotel
			for(Comodidad c : h.getComodidades())
				PersistenciaComodidad.getInstancia().insertComodidadHotel(c, h.getId());
			
			//inserta imagenes hotel
			for(ImagenHotel img : h.getImagenes())
				PersistenciaImagenHotel.getInstancia().insertImagenHotel(img, h.getId());
			
			return h;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al insertar Hotel: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
				return h;
	      }	      
	}
	
	public Hotel guardarHotel(Hotel h) //HECHO
	{ 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();				
		try
		{
			String senten = "UPDATE Hotel SET "
					+ "codigo = ?, "
					+ "nombre = ?, "
					+ "id_destino = ?, "
					+ "domicilio = ?, "
					+ "cod_postal = ?, "
					+ "activo = ?, "
					+ "categoria = ?, "
					+ "calificacion = ?, "
					+ "cadena = ?, "
					+ "tel = ? , "
					+ "email = ?, "
					+ "web = ?, "
					+ "descripcion = ? "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, h.getCodigo());
			ps.setString(2, h.getNombre());
			ps.setInt(3, h.getDestino().getId());
			ps.setString(4, h.getDomicilio());
			ps.setString(5, h.getCodigoPostal());
			ps.setBoolean(6, h.estaActivo());
			ps.setInt(7, h.getCategoria());
			ps.setInt(8, h.getCategoriaInterna());
			ps.setString(9, h.getCadena());
			ps.setString(10, h.getTelefono());
			ps.setString(11, h.getEmail());
			ps.setString(12, h.getWeb());
			ps.setString(13, h.getDescripcion());
			ps.setInt(14, h.getId());			
			ps.execute();
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			
			//elimina imagenes hotel
			PersistenciaImagenHotel.getInstancia().eliminarImagenesHotel(h.getId());
			
			//elimina comodidades
			PersistenciaComodidad.getInstancia().eliminarComodidadesHotel(h.getId());
			
			//update o insert de habitaciones del hotel
			for(Habitacion hab : h.getHabitaciones()){
				if(hab.getId() > 0){
					PersistenciaHabitacion.getInstancia().guardarHabitacion(hab, h.getId());
				}else{
					PersistenciaHabitacion.getInstancia().insertHabitacion(hab, h.getId());
				}
			}

			//inserta comodidades hotel
			for(Comodidad c : h.getComodidades())
				PersistenciaComodidad.getInstancia().insertComodidadHotel(c, h.getId());
			
			//inserta imagenes hotel
			for(ImagenHotel img : h.getImagenes())
				PersistenciaImagenHotel.getInstancia().insertImagenHotel(img, h.getId());
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al actualizar Hotel: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
		return h;
	}

	public void eliminarHotel(Hotel h) //HECHO
	{
		//elimina imagenes hotel
		PersistenciaImagenHotel.getInstancia().eliminarImagenesHotel(h.getId());
		
		//elimina comodidades
		PersistenciaComodidad.getInstancia().eliminarComodidadesHotel(h.getId());
		
		//elimina habitaciones
		PersistenciaHabitacion.getInstancia().eliminarHabitaciones(h.getId());
		
		Connection con = PoolConexiones.getPoolConexiones().getConnection();				
		try
		{
			String senten = "DELETE FROM Hotel "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,h.getId());
			ps.executeUpdate();
			con.commit();
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al eliminar Hotel: " + e.getMessage());
				e.printStackTrace();
				try{
					if(con!=null)
			            con.rollback();
				}catch( SQLException e2){
					e2.printStackTrace();
				}
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	}
	
	public Hotel getHotel(int id) //HECHO
	{
		Hotel h = null; 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, codigo, nombre, id_destino, domicilio, cod_postal, "
					+ "activo, categoria, calificacion, cadena, tel, email, web, descripcion "
					+ "FROM Hotel "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,id);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				h = new Hotel(
						id
						, result.getString("codigo")
						, result.getString("nombre")
						, PersistenciaDestino.getInstancia().getDestino(result.getInt("id_destino"))
						, result.getString("domicilio")
						, result.getString("cod_postal")
						, result.getBoolean("activo")
						, result.getInt("categoria")
						, result.getInt("calificacion")
						, result.getString("cadena")
						, result.getString("tel")
						, result.getString("email")
						, result.getString("web")
						, result.getString("descripcion")
						, PersistenciaImagenHotel.getInstancia().getImagenes(result.getInt("id"))
						, PersistenciaComodidad.getInstancia().getComodidadesHotel(result.getInt("id"))
						, PersistenciaHabitacion.getInstancia().getHabitaciones(result.getInt("id"))
						);
			}
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return h;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Hotel: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return h;
	}
	
	public ArrayList<Hotel> getHoteles() //HECHO
	{
		Hotel h = null; 
		ArrayList<Hotel> listaHoteles = new ArrayList<Hotel>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, codigo, nombre, id_destino, domicilio, cod_postal, "
					+ "activo, categoria, calificacion, cadena, tel, email, web, descripcion "
					+ "FROM Hotel" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				h = new Hotel(
						result.getInt("id")
						, result.getString("codigo")
						, result.getString("nombre")
						, PersistenciaDestino.getInstancia().getDestino(result.getInt("id_destino"))
						, result.getString("domicilio")
						, result.getString("cod_postal")
						, result.getBoolean("activo")
						, result.getInt("categoria")
						, result.getInt("calificacion")
						, result.getString("cadena")
						, result.getString("tel")
						, result.getString("email")
						, result.getString("web")
						, result.getString("descripcion")
						, PersistenciaImagenHotel.getInstancia().getImagenes(result.getInt("id"))
						, PersistenciaComodidad.getInstancia().getComodidadesHotel(result.getInt("id"))
						, PersistenciaHabitacion.getInstancia().getHabitaciones(result.getInt("id"))
						);
				listaHoteles.add(h);
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return listaHoteles;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Hotel: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return listaHoteles;
	}
	
	public ArrayList<Hotel> getHoteles(String nombreHotel, int idHotel, int estado, int categoria) //HECHO
	{		
		Hotel h = null; 
		ArrayList<Hotel> listaHoteles = new ArrayList<Hotel>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		int paramNumber=1;
		try
		{
			String senten = "SELECT id, codigo, nombre, id_destino, domicilio, cod_postal, "
					+ "activo, categoria, calificacion, cadena, tel, email, web, descripcion "
					+ "FROM Hotel WHERE id >= 0" ;
			if ( idHotel>0)
			{
				senten+=" and id=?";
			}
			if (estado==0 || estado==1)
			{
				senten+=" and activo=?";
			}
			if ( nombreHotel!=null && nombreHotel.length()>0)
			{
				senten+=" and nombre=?";
			}			
			if ( categoria>0)
			{
				senten+=" and categoria=?";
			}			
			PreparedStatement ps = con.prepareStatement(senten);
			
			if ( idHotel>0)
			{
				ps.setInt(paramNumber,idHotel);
				paramNumber++;
			}
			if (estado==0 || estado==1)
			{
				ps.setInt(paramNumber,estado);				
				paramNumber++;
			}
			if ( nombreHotel!=null && nombreHotel.length()>0)
			{
				ps.setString(paramNumber,nombreHotel);
				paramNumber++;
			}			
			if ( categoria>0)
			{
				ps.setInt(paramNumber,categoria);
				paramNumber++;
			}
			
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				h = new Hotel(
						result.getInt("id")
						, result.getString("codigo")
						, result.getString("nombre")
						, PersistenciaDestino.getInstancia().getDestino(result.getInt("id_destino"))
						, result.getString("domicilio")
						, result.getString("cod_postal")
						, result.getBoolean("activo")
						, result.getInt("categoria")
						, result.getInt("calificacion")
						, result.getString("cadena")
						, result.getString("tel")
						, result.getString("email")
						, result.getString("web")
						, result.getString("descripcion")
						, PersistenciaImagenHotel.getInstancia().getImagenes(result.getInt("id"))
						, PersistenciaComodidad.getInstancia().getComodidadesHotel(result.getInt("id"))
						, PersistenciaHabitacion.getInstancia().getHabitaciones(result.getInt("id"))
						);
				listaHoteles.add(h);
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return listaHoteles;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Hoteles: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return listaHoteles;
	}

	public ArrayList<Comodidad> getComodidades() //HECHO
	{		
		Comodidad c;
		ArrayList<Comodidad> lista = new ArrayList<Comodidad>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, nombre FROM Comodidad";					
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				c = new Comodidad(result.getInt("id"), result.getString("nombre"));
				lista.add(c);
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return lista;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Comodidades: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return lista;
	}
	
}
